home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / cal / cal.c next >
C/C++ Source or Header  |  1993-11-30  |  18KB  |  800 lines

  1. /* 1992.10.3 守屋一成(morip)作 */
  2. /* 1993.6.27 一部変更 */
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8.  
  9. double analyze(char[],int *);
  10. double takevalue(char[],int *,int *);
  11. double pai(int,int,char[],int *);
  12. double sigma(int,int,char[],int *);
  13. double sinc(double);
  14. double pulse(double);
  15. double biterm(char[],double,int *,int,int *);
  16. double triangle(double);
  17. int next(char[],int),level(char);
  18. unsigned prtcpy(char[],int,int);
  19. unsigned spacefilter(char[]);
  20. void itoa(int,char[],int);
  21.  
  22. int ssp;
  23.  
  24. void itoa(int inp,char oup[],int base)
  25. {
  26.   double id,bd,a;
  27.   int len,i,b;
  28.   char tmp[10];
  29.   
  30.   id=(double)inp;
  31.   bd=(double)base;
  32.   
  33.   a=floor(id/bd);
  34.   b=(int)(id-a*bd);
  35.   
  36.   tmp[0]='\0';
  37.   
  38.   while(a>0.0){
  39.     switch(b){
  40.       case 0:strcat(tmp,"0"); break;
  41.       case 1:strcat(tmp,"1"); break;
  42.       case 2:strcat(tmp,"2"); break;
  43.       case 3:strcat(tmp,"3"); break;
  44.       case 4:strcat(tmp,"4"); break;
  45.       case 5:strcat(tmp,"5"); break;
  46.       case 6:strcat(tmp,"6"); break;
  47.       case 7:strcat(tmp,"7"); break;
  48.       case 8:strcat(tmp,"8"); break;
  49.       case 9:strcat(tmp,"9"); break;
  50.     }
  51.     
  52.     id=a;
  53.     
  54.     a=floor(id/bd);
  55.     b=(int)(id-a*bd);
  56.   }
  57.   
  58.   switch(b){
  59.     case 0:strcat(tmp,"0"); break;
  60.     case 1:strcat(tmp,"1"); break;
  61.     case 2:strcat(tmp,"2"); break;
  62.     case 3:strcat(tmp,"3"); break;
  63.     case 4:strcat(tmp,"4"); break;
  64.     case 5:strcat(tmp,"5"); break;
  65.     case 6:strcat(tmp,"6"); break;
  66.     case 7:strcat(tmp,"7"); break;
  67.     case 8:strcat(tmp,"8"); break;
  68.     case 9:strcat(tmp,"9"); break;
  69.   }
  70.   
  71.   len=strlen(tmp);
  72.   
  73.   for(i=0;i<=len-1;i++){
  74.     oup[i]=tmp[len-1-i];
  75.   }
  76.   oup[len]='\0';
  77. }
  78.  
  79. unsigned spacefilter(char expression[])  /* スペースを取除く */
  80. {
  81.   int i,j;
  82.   char c,ext[256];
  83.   
  84.   i=0;
  85.   j=0;
  86.   c=expression[j];
  87.   while(c!='\0'){
  88.     while(c==' '){
  89.       j++;
  90.       c=expression[j];
  91.     }
  92.     ext[i]=c;
  93.     i++;
  94.     j++;
  95.     c=expression[j];
  96.   }
  97.   
  98.   ext[i]='\0';
  99.   return((unsigned)ext);
  100. }
  101.  
  102. unsigned prtcpy(char expression[],int start,int end)  /* startからendまでの文字列を取り出す */
  103. {
  104.   char extract[256];
  105.   int k;
  106.   
  107.   for(k=0;k<=end-start;k++){
  108.     extract[k]=expression[k+start];
  109.   }
  110.   extract[k]='\0';
  111.   return((unsigned)extract);
  112. }
  113.  
  114. int next(char expression[],int i)  /* ”(”に対応する”)”の位置を検出する */
  115. {
  116.   char c;
  117.   
  118.   c=expression[i];
  119.   while(c!=')'){
  120.     i++;
  121.     if(c=='('){
  122.       i=next(expression,i);
  123.       i++;
  124.     }
  125.     c=expression[i];
  126.   }
  127.   return(i);
  128. }
  129.  
  130. double pai(int start,int end,char expression[],int *err) /* Π(総積) */
  131. {
  132.   double a;
  133.   int i,j,k,l,len;
  134.   char c,argument,extract[256],number[10];
  135.   
  136.   if(start>end){
  137.     printf("Error! Start value larger than end value");
  138.     exit(0);
  139.   }
  140.   ssp++;   /* ネスティングの回数 */
  141.   argument=(char)('a'+ssp-1);
  142.   strcpy(extract,expression);
  143.   a=1.0;
  144.   for(i=start;i<=end;i++){
  145.     itoa(i,number,10);
  146.     k=0;
  147.     len=strlen(extract);
  148.     if(len==0){
  149.       printf("Error! Illeagal parameter");
  150.       exit(4);
  151.     }
  152.     for(j=0;j<=len-1;j++){
  153.       c=extract[j];
  154.       if(c==argument){
  155.         if(j-1>=0){
  156.           if(islower(extract[j-1])==0){
  157.             if(j+1<=len){
  158.               if(islower(extract[j-1])==0){
  159.                 l=k;
  160.                 c=number[k-l];
  161.                 while(c!='\0'){
  162.                   expression[k]=c;
  163.                   k++;
  164.                   c=number[k-l];
  165.                 }
  166.               }
  167.               else{
  168.                 expression[k]=c;
  169.                 k++;
  170.               }
  171.             }
  172.             else{
  173.               l=k;
  174.               c=number[k-l];
  175.               while(c!='\0'){
  176.                 expression[k]=c;
  177.                 k++;
  178.                 c=number[k-l];
  179.               }
  180.             }
  181.           }
  182.           else{
  183.             expression[k]=c;
  184.             k++;
  185.           }
  186.         }
  187.         else if(j+1<=len){
  188.           if(islower(extract[j-1])==0){
  189.             l=k;
  190.             c=number[k-l];
  191.             while(c!='\0'){
  192.               expression[k]=c;
  193.               k++;
  194.               c=number[k-l];
  195.             }
  196.           }
  197.           else{
  198.             expression[k]=c;
  199.             k++;
  200.           }
  201.         }
  202.       }
  203.       else{
  204.         expression[k]=c;
  205.         k++;
  206.       }
  207.     }
  208.     expression[k]='\0';
  209.     a=a*analyze(expression,err);
  210.   }
  211.   ssp--;
  212.   return(a);
  213. }
  214.  
  215. double sigma(int start,int end,char expression[],int *err) /* Σ(総和) */
  216. {
  217.   double a;
  218.   int i,j,k,l,len;
  219.   char c,argument,extract[256],number[10];
  220.   
  221.   if(start>end){
  222.     printf("Error! Start value larger than end value");
  223.     exit(0);
  224.   }
  225.   ssp++;
  226.   argument=(char)('a'+ssp-1);
  227.   strcpy(extract,expression);
  228.   a=0.0;
  229.   for(i=start;i<=end;i++){
  230.     itoa(i,number,10);
  231.     k=0;
  232.     len=strlen(extract);
  233.     if(len==0){
  234.       printf("Error! Illeagal parameter");
  235.       exit(8);
  236.     }
  237.     for(j=0;j<=len-1;j++){
  238.       c=extract[j];
  239.       if(c==argument){
  240.         if(j-1>=0){
  241.           if(islower(extract[j-1])==0){
  242.             if(j+1<=len){
  243.               if(islower(extract[j-1])==0){
  244.                 l=k;
  245.                 c=number[k-l];
  246.                 while(c!='\0'){
  247.                   expression[k]=c;
  248.                   k++;
  249.                   c=number[k-l];
  250.                 }
  251.               }
  252.               else{
  253.                 expression[k]=c;
  254.                 k++;
  255.               }
  256.             }
  257.             else{
  258.               l=k;
  259.               c=number[k-l];
  260.               while(c!='\0'){
  261.                 expression[k]=c;
  262.                 k++;
  263.                 c=number[k-l];
  264.               }
  265.             }
  266.           }
  267.           else{
  268.             expression[k]=c;
  269.             k++;
  270.           }
  271.         }
  272.         else if(j+1<=len){
  273.           if(islower(extract[j-1])==0){
  274.             l=k;
  275.             c=number[k-l];
  276.             while(c!='\0'){
  277.               expression[k]=c;
  278.               k++;
  279.               c=number[k-l];
  280.             }
  281.           }
  282.           else{
  283.             expression[k]=c;
  284.             k++;
  285.           }
  286.         }
  287.       }
  288.       else{
  289.         expression[k]=c;
  290.         k++;
  291.       }
  292.     }
  293.     expression[k]='\0';
  294.     a=a+analyze(expression,err);
  295.   }
  296.   ssp--;
  297.   return(a);
  298. }
  299.  
  300. double sinc(double x) /* sinc関数 */
  301. {
  302.   double a,pai;
  303.   
  304.   if(x==0)
  305.     a=1.0;
  306.   else{
  307.     pai=3.1415926535897932384626433832795028841971693;
  308.     a=sin(pai*x)/(pai*x);
  309.   }
  310.   return(a);
  311. }
  312.  
  313. double pulse(double x) /* 単パルス関数 */
  314. {
  315.   double a;
  316.   
  317.   if(x>=-0.5 && x<=0.5)
  318.     a=1;
  319.   else 
  320.     a=0;
  321.   return(a);
  322. }
  323.  
  324. double triangle(double x) /* 三角波関数 */
  325. {
  326.   double a,p,s,pai;
  327.   
  328.   pai=3.1415926535897932384626433832795028841971693;
  329.   s=1.0;
  330.   a=0;
  331.   p=pai/2;
  332.   
  333.   if(x<0){
  334.     s=-1;
  335.     x=-x;
  336.   }
  337.   x=x-2*pai*floor(x/(2*pai));
  338.   if(x>=0 && x<=p)
  339.     a=x/p;
  340.   else if(x>p && x<=pai+p)
  341.     a=-x/p+2;
  342.   else if(x>pai+p && x<=2*pai)
  343.     a=x/p-4;
  344.   a=a*s;
  345.   return(a);
  346. }
  347.  
  348. double takevalue(char expression[],int *point,int *err) /* 値を取ってくる */
  349. {
  350.   double a,b,sgn;
  351.   int i,j,k,l,len;
  352.   char c,func[10],extract[256];
  353.   static char *fnc[]={
  354.     "abs",
  355.     "acos",
  356.     "asin",
  357.     "atan",
  358.     "ceil",
  359.     "cos",
  360.     "cosh",
  361.     "exp",
  362.     "floor",
  363.     "log",
  364.     "log2",
  365.     "log10",
  366.     "sin",
  367.     "sinh",
  368.     "sqrt",
  369.     "tan",
  370.     "tanh",
  371.     "pai",
  372.     "sigma",
  373.     "sinc",
  374.     "pulse",
  375.     "pow",
  376.     "triangle"
  377.   };
  378.   
  379.   static char *con[]={
  380.     "pai",
  381.     "e"
  382.   };
  383.   a=0;
  384.   i=0;
  385.   c=expression[i];
  386.   if(c=='-' || c=='+'){          /* 単項演算子のとき */
  387.     sgn=1.0;
  388.     if(c=='-') sgn=-1.0;
  389.     i++;
  390.     *point=*point+1;
  391.     len=strlen(expression);
  392.     strcpy(extract,(char *)prtcpy(expression,i,len));
  393.     a=sgn*takevalue(extract,point,err);
  394.   }
  395.   else if(c=='('){          /* ”(”のとき */
  396.     i++;
  397.     j=next(expression,i)-1;
  398.     strcpy(extract,(char *)prtcpy(expression,i,j));
  399.     a=analyze(extract,err);
  400.     *point=*point+j+2;
  401.   }
  402.   else if(isdigit(c)!=0 || c=='.'){    /* 数字のとき */
  403.     j=0;
  404.     extract[j]=c;
  405.     j++;
  406.     c=expression[j];
  407.     while(isdigit(c)!=0 || c=='.' || c=='d' || c=='D' || c=='e' || c=='E'){
  408.       extract[j]=c;
  409.       j++;
  410.       if(c=='d' || c=='D' || c=='e' || c=='E'){
  411.         c=expression[j];
  412.         if(isdigit(c)!=0 || c=='+' || c=='-'){
  413.           extract[j]=c;
  414.           j++;
  415.         }
  416.         else{
  417.           printf("Error! Illeagal value declaration");
  418.           exit(9);
  419.         }
  420.       }
  421.       c=expression[j];
  422.     }
  423.     extract[j]='\0';
  424.     a=atof(extract);
  425.     *point=*point+j;
  426.   }
  427.   else if(islower(c)!=0){  /* アルファベットのとき */
  428.     j=0;
  429.     func[j]=c;
  430.     j++;
  431.     c=expression[j];
  432.     while(isalnum(c)!=0){
  433.       func[j]=c;
  434.       j++;
  435.       if(j>9){
  436.         printf("Error! Illeagal function name");
  437.         exit(9);
  438.       }
  439.       c=expression[j];
  440.     }
  441.     func[j]='\0';
  442.     i=j;
  443.     if(c!='('){   /* 定数 */
  444.       if(strcmp(func,con[0])==0)
  445.         a=3.1415926535897932384626433832795028841971693;
  446.       else if(strcmp(func,con[1])==0)
  447.         a=2.7182818284590452353602874713526624977572;
  448.       else{
  449.         printf("Error! Illeagal constant name");
  450.         exit(10);
  451.       }
  452.     *point=*point+j;
  453.     }
  454.     else{  /* 関数 */
  455.       i++;
  456.       j=next(expression,i)-1;
  457.       strcpy(extract,(char *)prtcpy(expression,i,j));
  458.       if(strcmp(func,fnc[17])!=0 && strcmp(func,fnc[18])!=0 && strcmp(func,fnc[21])!=0)
  459.         a=analyze(extract,err);
  460.       else{   /* Π、Σ、powのとき */
  461.         strcpy(expression,extract);
  462.         len=strlen(expression);
  463.         k=0;
  464.         l=0;
  465.         c=expression[k];
  466.         while(c!=',' && l<=len){
  467.           extract[l]=c;
  468.           l++;
  469.           c=expression[l];
  470.         }
  471.         extract[l]='\0';
  472.         if(l>len){
  473.           printf("Error! Illeagal parameter");
  474.           exit(1);
  475.         }
  476.         a=analyze(extract,err);
  477.         k=l+1;
  478.         l=0;
  479.         c=expression[k];
  480.         while(c!=',' && k+l<=len){
  481.           extract[l]=c;
  482.           l++;
  483.           c=expression[k+l];
  484.         }
  485.         extract[l]='\0';
  486.         k=k+l+1;
  487.         if(strcmp(func,fnc[21])!=0){
  488.           if(k>len){
  489.             printf("Error! Illeagal parameter");
  490.             exit(2);
  491.           }
  492.           b=analyze(extract,err);
  493.           
  494.           for(l=k;l<=len;l++){
  495.             extract[l-k]=expression[l];
  496.           }
  497.           extract[len-k+1]='\0';
  498.         }
  499.         else
  500.           b=analyze(extract,err);
  501.       }
  502.       *point=*point+j+2;
  503.       
  504.       if(strcmp(func,fnc[0])==0)
  505.         a=fabs(a);
  506.       else if(strcmp(func,fnc[1])==0)
  507.         a=acos(a);
  508.       else if(strcmp(func,fnc[2])==0)
  509.         a=asin(a);
  510.       else if(strcmp(func,fnc[3])==0)
  511.         a=atan(a);
  512.       else if(strcmp(func,fnc[4])==0)
  513.         a=ceil(a);
  514.       else if(strcmp(func,fnc[5])==0)
  515.         a=cos(a);
  516.       else if(strcmp(func,fnc[6])==0)
  517.         a=cosh(a);
  518.       else if(strcmp(func,fnc[7])==0)
  519.         a=exp(a);
  520.       else if(strcmp(func,fnc[8])==0)
  521.         a=floor(a);
  522.       else if(strcmp(func,fnc[9])==0){
  523.         if(a<=0){
  524.           *err=1;
  525.           a=1e300;
  526.         }
  527.         else
  528.           a=log(a);
  529.       }
  530.       else if(strcmp(func,fnc[10])==0){
  531.         if(a<=0){
  532.           *err=1;
  533.           a=1e300;
  534.         }
  535.         else
  536.           a=log(a)/log(2);
  537.       }
  538.       else if(strcmp(func,fnc[11])==0){
  539.         if(a<=0){
  540.           *err=1;
  541.           a=1e300;
  542.         }
  543.         else
  544.           a=log10(a);
  545.       }
  546.       else if(strcmp(func,fnc[12])==0)
  547.         a=sin(a);
  548.       else if(strcmp(func,fnc[13])==0)
  549.         a=sinh(a);
  550.       else if(strcmp(func,fnc[14])==0)
  551.         a=sqrt(a);
  552.       else if(strcmp(func,fnc[15])==0)
  553.         a=tan(a);
  554.       else if(strcmp(func,fnc[16])==0)
  555.         a=tanh(a);
  556.       else if(strcmp(func,fnc[17])==0)
  557.         a=pai((int)a,(int)b,extract,err);
  558.       else if(strcmp(func,fnc[18])==0)
  559.         a=sigma((int)a,(int)b,extract,err);
  560.       else if(strcmp(func,fnc[19])==0)
  561.         a=sinc(a);
  562.       else if(strcmp(func,fnc[20])==0)
  563.         a=pulse(a);
  564.       else if(strcmp(func,fnc[21])==0){
  565.         if(a<0 && b!=floor(b))
  566.           a=0;
  567.         else
  568.           a=pow(a,b);
  569.       }
  570.       else if(strcmp(func,fnc[22])==0)
  571.         a=triangle(a);
  572.       else{
  573.         printf("Error! Illeagal function name");
  574.         exit(11);
  575.       }
  576.     }
  577.   }
  578.   else{
  579.     printf("Error! Illeagal syntax");
  580.     exit(12);
  581.   }
  582.   return(a);
  583. }
  584.  
  585. int level(char operater) /* 二項演算子の優先順位 */
  586. {
  587.   int i,l;
  588.   char level[6]={'^','*','/','%','+','-'};
  589.   
  590.   l=0;
  591.   for(i=0;i<=5;i++){
  592.     if(operater==level[i]){
  593.       if(i==0) l=0;
  594.       else if(i==1 || i==2 || i==3) l=1;
  595.       else if(i==4 || i==5) l=2;
  596.       break;
  597.     }
  598.   }
  599.   return(l);
  600. }
  601. double biterm(char expression[],double a,int *point,int lev,int *err)   /* 二項演算 */
  602. {
  603.   int i,j,k,len,lv;
  604.   double b,d,s;
  605.   char c,extract[256];
  606.   
  607.   d=0;
  608.   s=1.0;
  609.   i=0;
  610.   len=strlen(expression);
  611.   c=expression[i];
  612.   lv=level(c);
  613.   if(lv<lev) lv=lev;
  614.   i++;
  615.   k=*point;
  616.   *point=*point+1;
  617.   strcpy(extract,(char *)prtcpy(expression,i,len));
  618.   strcpy(expression,extract);
  619.   j=*point;
  620.   switch(c){
  621.     case '^':{
  622.       b=takevalue(expression,point,err);
  623.       i=i+*point-j-1;
  624.       if(i+1<=len-1){
  625.         c=expression[i];
  626.         if(lv>level(c)){
  627.           if(a<0 && b!=floor(b))
  628.             b=0;
  629.           else
  630.             b=pow(a,b);
  631.           strcpy(extract,(char *)prtcpy(expression,i,len));
  632.           *point=k+i+1;
  633.           d=biterm(extract,b,point,lv,err);
  634.         }
  635.         else
  636.           if(a<0 && b!=floor(b))
  637.             d=0;
  638.           else
  639.             d=pow(a,b);
  640.       }
  641.       else
  642.         d=pow(a,b);
  643.     } break;
  644.     case '*':{
  645.       b=takevalue(expression,point,err);
  646.       i=i+*point-j-1;
  647.       if(i+1<=len-1){
  648.         c=expression[i];
  649.         if(lv>level(c)){
  650.           if(c=='^'){
  651.             strcpy(extract,(char *)prtcpy(expression,i,len));
  652.             *point=k+i+1;
  653.             b=biterm(extract,b,point,lv,err);
  654.             d=a*b;
  655.           }
  656.           else{
  657.             b=a*b;
  658.             strcpy(extract,(char *)prtcpy(expression,i,len));
  659.             *point=k+i+1;
  660.             d=biterm(extract,b,point,lv,err);
  661.           }
  662.         }
  663.         else
  664.           d=a*b;
  665.       }
  666.       else
  667.         d=a*b;
  668.     } break;
  669.     case '/':{
  670.       b=takevalue(expression,point,err);
  671.       i=i+*point-j-1;
  672.       if(i+1<=len-1){
  673.         c=expression[i];
  674.         if(lv>level(c)){
  675.           if(c=='^'){
  676.             strcpy(extract,(char *)prtcpy(expression,i,len));
  677.             *point=k+i+1;
  678.             b=biterm(extract,b,point,lv,err);
  679.             if(b==0){
  680.               *err=1;
  681.               d=1e300;
  682.             }
  683.             else
  684.               d=a/b;
  685.           }
  686.           else{
  687.             if(b==0){
  688.               *err=1;
  689.               d=1e300;
  690.             }
  691.             else
  692.               b=a/b;
  693.             strcpy(extract,(char *)prtcpy(expression,i,len));
  694.             *point=k+i+1;
  695.             d=biterm(extract,b,point,lv,err);
  696.           }
  697.         }
  698.         else{
  699.           if(b==0){
  700.             *err=1;
  701.             d=1e300;
  702.           }
  703.           else
  704.             d=a/b;
  705.         }
  706.       }
  707.       else{
  708.         if(b==0){
  709.           *err=1;
  710.           d=1e300;
  711.         }
  712.         else
  713.           d=a/b;
  714.       }
  715.     } break;
  716.     case '%':{
  717.       b=takevalue(expression,point,err);
  718.       i=i+*point-j-1;
  719.       if(i+1<=len-1){
  720.         c=expression[i];
  721.         if(lv>level(c)){
  722.           if(c=='^'){
  723.             strcpy(extract,(char *)prtcpy(expression,i,len));
  724.             *point=k+i+1;
  725.             b=biterm(extract,b,point,lv,err);
  726.             d=fmod(a,b);
  727.           }
  728.           else{
  729.             b=fmod(a,b);
  730.             strcpy(extract,(char *)prtcpy(expression,i,len));
  731.             *point=k+i+1;
  732.             d=biterm(extract,b,point,lv,err);
  733.           }
  734.         }
  735.         else
  736.           d=fmod(a,b);
  737.       }
  738.       else
  739.         d=fmod(a,b);
  740.     } break;
  741.     case '-':s=-1.0;
  742.     case '+':{
  743.       b=takevalue(expression,point,err);
  744.       i=i+*point-j-1;
  745.       if(i+1<=len-1){
  746.         c=expression[i];
  747.         if(lv>level(c)){
  748.           strcpy(extract,(char *)prtcpy(expression,i,len));
  749.           *point=k+i+1;
  750.           b=biterm(extract,b,point,lv,err);
  751.         }
  752.       }
  753.       d=a+s*b;
  754.     } break;
  755.     default:{
  756.       printf("Error! Illeagal operater");
  757.       exit(13);
  758.     }
  759.   }
  760.   return(d);
  761. }
  762.  
  763. double analyze(char expression[],int *err) /* メイン部分 */
  764. {
  765.   int len,point; /* point:与えられた数式での位置 */
  766.   double a;
  767.   char extract[256];
  768.   
  769.   strcpy(expression,(char *)spacefilter(expression));
  770.   len=strlen(expression);
  771.   point=1;
  772.   a=takevalue(expression,&point,err);
  773.   while(point<=len){
  774.     strcpy(extract,(char *)prtcpy(expression,point-1,len));
  775.     a=biterm(extract,a,&point,0,err);
  776.   }
  777.   return(a);
  778. }
  779.  
  780. void main(int argc,char *argv[])
  781. {
  782.   double a;
  783.   int err;
  784.   char expression[256];
  785.   
  786.   err=0;
  787.   strcpy(expression,argv[1]);
  788.   
  789.   if(argc!=2){
  790.     printf("\ncal 式\nの形式で入力 (例 cal 10*(2^8-1))\n");
  791.     exit(0);
  792.   }
  793.   
  794.   a=analyze(argv[1],&err);
  795.   
  796.   if(err!=0)
  797.     printf("\n演算中にエラーが発生しました。\n");
  798.   printf("\n%s=%17.15f\n指数形式 =%23.15e\n",expression,a,a);
  799. }
  800.